columnview: Add a sort-by api
authorMatthias Clasen <mclasen@redhat.com>
Wed, 4 Dec 2019 02:31:57 +0000 (21:31 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 30 May 2020 23:28:28 +0000 (19:28 -0400)
docs/reference/gtk/gtk4-sections.txt
gtk/gtkcolumnview.c
gtk/gtkcolumnview.h
gtk/gtkcolumnviewsorter.c
gtk/gtkcolumnviewsorterprivate.h

index 071d026d0725fd1ce0199b87cc8eb2a2e2e449c2..3f2597cedf669cfcd83af6ca8a3482aff3b285af 100644 (file)
@@ -503,6 +503,7 @@ gtk_column_view_set_model
 gtk_column_view_get_sorter
 gtk_column_view_get_show_separators
 gtk_column_view_set_show_separators
+gtk_column_view_sort_by_column
 <SUBSECTION Standard>
 GTK_COLUMN_VIEW
 GTK_COLUMN_VIEW_CLASS
index 9d3bf9129971bc3d5cbdbb77e48349bd6968e34d..32a2bea66c07c3b1abb4899ac7f84b80cbdadda8 100644 (file)
@@ -736,3 +736,36 @@ gtk_column_view_get_sorter (GtkColumnView *self)
   return self->sorter;
 }
 
+/**
+ * gtk_column_view_sort_by_column:
+ * @self: a #GtkColumnView
+ * @column: (allow-none): the #GtkColumnViewColumn to sort by, or %NULL
+ * @direction: the direction to sort in
+ *
+ * Sets the sorting of the view.
+ *
+ * This function should be used to set up the initial sorting. At runtime,
+ * users can change the sorting of a column view by clicking on the list headers.
+ *
+ * This call only has an effect if the sorter returned by gtk_column_view_get_sorter()
+ * is set on a sort model, and gtk_column_view_column_set_sorter() has been called
+ * on @column to associate a sorter with the column.
+ *
+ * If @column is %NULL, the view will be unsorted.
+ */
+void
+gtk_column_view_sort_by_column (GtkColumnView       *self,
+                                GtkColumnViewColumn *column,
+                                GtkSortType          direction)
+{
+  g_return_if_fail (GTK_IS_COLUMN_VIEW (self));
+  g_return_if_fail (column == NULL || GTK_IS_COLUMN_VIEW_COLUMN (column));
+  g_return_if_fail (column == NULL || gtk_column_view_column_get_column_view (column) == self);
+
+  if (column == NULL)
+    gtk_column_view_sorter_clear (GTK_COLUMN_VIEW_SORTER (self->sorter));
+  else
+    gtk_column_view_sorter_set_column (GTK_COLUMN_VIEW_SORTER (self->sorter),
+                                       column,
+                                       direction == GTK_SORT_DESCENDING);
+}
index 6ec91319e8a83900f7d83274c6836c459bd0589f..b24dc7d3084967ede7c5229b9acf168551eb5a76 100644 (file)
@@ -77,6 +77,10 @@ void            gtk_column_view_set_show_separators             (GtkColumnView
 GDK_AVAILABLE_IN_ALL
 GtkSorter *     gtk_column_view_get_sorter                      (GtkColumnView          *self);
 
+void            gtk_column_view_sort_by_column                  (GtkColumnView          *self,
+                                                                 GtkColumnViewColumn    *column,
+                                                                 GtkSortType             direction);
+
 G_END_DECLS
 
 #endif  /* __GTK_COLUMN_VIEW_H__ */
index d431de0cb72bddaac8edccfabf9966b42af6b79e..587731e1cdf68cdd3090f09483663fd52a7e9d60 100644 (file)
@@ -239,6 +239,43 @@ gtk_column_view_sorter_remove_column (GtkColumnViewSorter *self,
   return FALSE;
 }
 
+gboolean
+gtk_column_view_sorter_set_column (GtkColumnViewSorter *self,
+                                   GtkColumnViewColumn *column,
+                                   gboolean             inverted)
+{
+  GtkSorter *sorter;
+  Sorter *s;
+
+  g_return_val_if_fail (GTK_IS_COLUMN_VIEW_SORTER (self), FALSE);
+  g_return_val_if_fail (GTK_IS_COLUMN_VIEW_COLUMN (column), FALSE);
+  
+  sorter = gtk_column_view_column_get_sorter (column);
+  if (sorter == NULL)
+    return FALSE;
+
+  g_object_ref (column);
+
+  g_sequence_remove_range (g_sequence_get_begin_iter (self->sorters),
+                           g_sequence_get_end_iter (self->sorters));
+
+  s = g_new (Sorter, 1);
+  s->column = g_object_ref (column);
+  s->sorter = g_object_ref (sorter);
+  s->changed_id = g_signal_connect (sorter, "changed", G_CALLBACK (gtk_column_view_sorter_changed_cb), self);
+  s->inverted = inverted;
+  g_sequence_prepend (self->sorters, s);
+
+  gtk_sorter_changed (GTK_SORTER (self), GTK_SORTER_CHANGE_DIFFERENT);
+
+  gtk_column_view_column_notify_sort (column);
+
+  g_object_unref (column);
+
+  return TRUE;
+}
+
 void
 gtk_column_view_sorter_clear (GtkColumnViewSorter *self)
 {
@@ -253,12 +290,16 @@ gtk_column_view_sorter_clear (GtkColumnViewSorter *self)
 
   iter = g_sequence_get_begin_iter (self->sorters);
   s = g_sequence_get (iter);
-  column = s->column;
+
+  column = g_object_ref (s->column);
+
   g_sequence_remove_range (iter, g_sequence_get_end_iter (self->sorters));
 
   gtk_sorter_changed (GTK_SORTER (self), GTK_SORTER_CHANGE_DIFFERENT);
 
   gtk_column_view_column_notify_sort (column);
+
+  g_object_unref (column);
 }
 
 GtkColumnViewColumn *
index ce899521709d44f14fefd52684f8eb2f13b0c468..c81c56525245312da51095ceb8a9aa543baa09fb 100644 (file)
@@ -46,6 +46,10 @@ void                    gtk_column_view_sorter_clear            (GtkColumnViewSo
 GtkColumnViewColumn *   gtk_column_view_sorter_get_sort_column  (GtkColumnViewSorter    *self,
                                                                  gboolean               *inverted);
 
+gboolean   gtk_column_view_sorter_set_column    (GtkColumnViewSorter *self,
+                                                 GtkColumnViewColumn *column,
+                                                 gboolean             inverted);
+
 
 G_END_DECLS